/**
 *
 */
package br.com.ac.fatureweb.view;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.event.ActionEvent;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.ac.fatureweb.integration.enums.EnumStatus;
import br.com.ac.fatureweb.model.PerfilAcao;
import br.com.ac.fatureweb.model.Usuario;
import br.com.ac.fatureweb.service.NgcPerfilBean;
import br.com.ac.fatureweb.service.NgcUsuarioBean;
import br.com.ac.fatureweb.utilitary.CrudDefaultBean;

/**
 * @author aldivone
 *
 */
@Named
@ViewScoped
public class UsuarioBean extends CrudDefaultBean<Usuario, NgcUsuarioBean> {

	private static final long serialVersionUID = 7989531879272938668L;

	@Inject
	private NgcUsuarioBean ngcUsuarioBean;

	@Inject
	private NgcPerfilBean ngcPerfilBean;

	private Boolean alterarSenhaState = false;

	private PerfilAcao[] selectedPerfilAcaoRemover;

	private PerfilAcao[] selectedPerfilAcaoAdicionar;

	private List<PerfilAcao> lstPerfilAcaoNaoAssociados;

	@PostConstruct
	public void inicialize() {
		setService(ngcUsuarioBean);
	}

	/*
	 * (non-Javadoc)
	 *
	 * @author Brunno Gonçalves (brunnogoncalves@gmail.com) 31/03/2015
	 *
	 * @see
	 * br.com.ac.fatureweb.utilitary.CrudDefaultBean#runAfterCallingService()
	 */
	@Override
	protected void runAfterCallingService() {
		super.runAfterCallingService();
		alterarSenhaState = false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @author Brunno Gonçalves (brunnogoncalves@gmail.com) 31/03/2015
	 * 
	 * @see
	 * br.com.ac.fatureweb.utilitary.CrudDefaultBean#cancel(javax.faces.event
	 * .ActionEvent)
	 */
	@Override
	public void cancel(ActionEvent event) {
		super.cancel(event);
		alterarSenhaState = false;
	}

	/**
	 * @author Brunno Gonçalves (brunnogoncalves@gmail.com) 31/03/2015
	 * @param event
	 */
	public void prepareChangePassword(final ActionEvent event) {
		super.prepareMerge(event);
		alterarSenhaState = true;
		getEntity().setSenha(null);
	}

	/**
	 * Busca lista de Ações para a popup
	 *
	 * @author Brunno Gonçalves (brunnogoncalves@gmail.com) 26/03/2015
	 * @param event
	 */
	public void buscarPerfisAcaoDesassociados(ActionEvent event) {
		lstPerfilAcaoNaoAssociados = ngcPerfilBean
				.buscarPerfisAcaoDesassociados(getEntity().getId());

		selectedPerfilAcaoAdicionar = null;
	}

	/**
	 * Adiciona ao usuário lista de ações selecionadas
	 *
	 * @author Brunno Gonçalves (brunnogoncalves@gmail.com) 26/03/2015
	 * @param event
	 */
	public void associarPerfisAcao(ActionEvent event) {
		for (PerfilAcao pea : selectedPerfilAcaoAdicionar) {
			if (getEntity().getLstPerfilAcao() == null) {
				getEntity().setLstPerfilAcao(new ArrayList<PerfilAcao>());
			}
			if (!getEntity().getLstPerfilAcao().contains(pea)) {
				getEntity().getLstPerfilAcao().add(pea);
			}
		}
	}

	/**
	 * Remove do usuário lista de ações selecionadas
	 *
	 * @author Brunno Gonçalves (brunnogoncalves@gmail.com) 26/03/2015
	 * @param event
	 */
	public void desassociarPerfisAcao(ActionEvent event) {
		getEntity().getLstPerfilAcao().removeAll(
				Arrays.asList(selectedPerfilAcaoRemover));
	}

	public List<EnumStatus> getLstEnumStatus() {
		return Arrays.asList(EnumStatus.values());
	}

	public PerfilAcao[] getSelectedPerfilAcaoRemover() {
		return selectedPerfilAcaoRemover;
	}

	public void setSelectedPerfilAcaoRemover(
			PerfilAcao[] selectedPerfilAcaoRemover) {
		this.selectedPerfilAcaoRemover = selectedPerfilAcaoRemover;
	}

	public PerfilAcao[] getSelectedPerfilAcaoAdicionar() {
		return selectedPerfilAcaoAdicionar;
	}

	public void setSelectedPerfilAcaoAdicionar(
			PerfilAcao[] selectedPerfilAcaoAdicionar) {
		this.selectedPerfilAcaoAdicionar = selectedPerfilAcaoAdicionar;
	}

	public List<PerfilAcao> getLstPerfilAcaoNaoAssociados() {
		return lstPerfilAcaoNaoAssociados;
	}

	public void setLstPerfilAcaoNaoAssociados(
			List<PerfilAcao> lstPerfilAcaoNaoAssociados) {
		this.lstPerfilAcaoNaoAssociados = lstPerfilAcaoNaoAssociados;
	}

	public Boolean getAlterarSenhaState() {
		return alterarSenhaState;
	}

	public void setAlterarSenhaState(Boolean alterarSenhaState) {
		this.alterarSenhaState = alterarSenhaState;
	}

}
